/**
 * 力扣（LeetCode） NO.122 买卖股票的最佳时机Ⅱ
 * 题目描述： 给定一个数组 prices ，其中 prices[i] 是一支给定股票第 i 天的价格。
 * 设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易（多次买卖一支股票）。
 * 注意：你不能同时参与多笔交易（你必须在再次购买前出售掉之前的股票）.
 *
 * 链接：https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-ii
 *
 */

/**
 * 示例 1:
 * 输入: prices = [7,1,5,3,6,4]
 * 输出: 7
 * 解释: 在第 2 天（股票价格 = 1）的时候买入，在第 3 天（股票价格 = 5）的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
     随后，在第 4 天（股票价格 = 3）的时候买入，在第 5 天（股票价格 = 6）的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。

 *示例 2:
 * 输入: prices = [1,2,3,4,5]
 * 输出: 4
 * 解释: 在第 1 天（股票价格 = 1）的时候买入，在第 5 天 （股票价格 = 5）的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
     注意你不能在第 1 天和第 2 天接连购买股票，之后再将它们卖出。因为这样属于同时参与了多笔交易，你必须在再次购买前出售掉之前的股票。

 *示例 3:
 * 输入: prices = [7,6,4,3,1]
 * 输出: 0
 * 解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。
 
*/

#include "stdio.h"

int maxProfit(int* prices, int pricesSize){
    //dp[i][j]：（i表示第几天；j表示是否持有股票，0表示持有，1表示已卖出。）第i天的最大利益。
    int dp[pricesSize][2];

    //第一天持有股票，则必是买了没卖，故收益为负数。
    dp[0][0] = -prices[0];
    //第一天未持有股票，则收益为0。
    dp[0][1] = 0;

    //状态转移方程
    for (int i = 1 ; i < pricesSize; i++) {

        dp[i][0] = dp[i - 1][0];
        if(dp[i][0] < dp[i - 1][1] - prices[i]){
            dp[i][0] = dp[i - 1][1] - prices[i];
        }

        dp[i][1] = dp[i - 1][1];
        if(dp[i][1] < dp[i - 1][0] + prices[i]){
            dp[i][1] = dp[i - 1][0] + prices[i];
        }
    }
    return dp[pricesSize - 1][1];
}

void main(){
        int arr[6] = {7,1,5,3,6,4};
        printf("%d",maxProfit(arr,6));
}